from flask import Blueprint, render_template, request
from flask_login import login_required, current_user
from sqlalchemy import desc

from applications.common import curd
from applications.common.curd import enable_status, disable_status
from applications.common.utils.http import table_api, fail_api, success_api
from applications.common.utils.rights import authorize
from applications.common.utils.validate import str_escape
from applications.extensions import db
from applications.models import Role, Dept
from applications.models import User, AdminLog
from applications.models import ProductionModel

bp = Blueprint('production', __name__, url_prefix='/production')


# 用户管理
@bp.get('/')
@authorize("traceability:production:main")
def main():

    return render_template('traceability/production/main.html')


#   用户分页查询
@bp.get('/data')
@authorize("traceability:production:main")
def data():
    # 获取请求参数
    商品条码 = str_escape(request.args.get('商品条码', type=str))

    名称 = str_escape(request.args.get('名称', type=str))


    filters = []
    if 商品条码:
        filters.append(ProductionModel.商品条码.contains(商品条码))
    if 名称:
        filters.append(ProductionModel.名称.contains(名称))

    query = db.session.query(
        ProductionModel
    ).filter(*filters).layui_paginate()

    return table_api(
        data=[{
            'id': item.id,
            '生产指令单号': item.生产指令单号,
            '名称': item.名称,
            '规格': item.规格,
            '产地': item.产地,
            '批号': item.批号,
            '生产日期': item.生产日期,
            '代码': item.代码,
            '执行标准': item.执行标准,
            '商品条码': item.商品条码,
            '包装规格': item.包装规格,
            '养护内容': item.养护内容,
            '生产厂家': item.生产厂家,
            '生产地址': item.生产地址,


        } for item in query.items],
        count=query.total)

    # 用户增加


@bp.get('/add')
@authorize("traceability:production:add", log=True)
def add():
    roles = Role.query.all()
    return render_template('traceability/production/add.html', roles=roles)


@bp.post('/save')
@authorize("traceability:production:add", log=True)
def save():
    req_json = request.get_json(force=True)

    row={
     '生产指令单号' :  str_escape(req_json.get("生产指令单号"))  , # 检验是否为空
    '名称' : str_escape(req_json.get("名称")) , # 检验是否为空
    '规格' : str_escape(req_json.get("规格")) , # 检验是否为空
    '产地' : str_escape(req_json.get("产地")),  # 检验是否为空
    '批号' : str_escape(req_json.get("批号")) , # 检验是否为空
    '生产日期' : str_escape(req_json.get("生产日期")) , # 检验是否为空
    '代码' : str_escape(req_json.get("代码")) , # 检验是否为空
    '执行标准' :  str_escape(req_json.get("执行标准"))  , # 检验是否为空
    '商品条码' : str_escape(req_json.get("商品条码")) , # 检验是否为空
    '包装规格' : str_escape(req_json.get("包装规格")) , # 检验是否为空
    '养护内容' : str_escape(req_json.get("养护内容")) if str_escape(req_json.get("养护内容")) else '',  # 检验是否为空
    '生产厂家' : str_escape(req_json.get("生产厂家")),  # 检验是否为空
    '生产地址' : str_escape(req_json.get("生产地址")),  # 检验是否为空
    }
    for k,v in row.items():
        if k=='养护内容':
            continue
        if not v:
            return fail_api(msg=f"{k}不得为空")

    try:
        pro=ProductionModel(**row)
        db.session.add(pro)

        db.session.commit()

    except Exception as e:
        print(e)
        return fail_api(msg=f"发生错误")
    return success_api(msg="增加成功")


# 删除用户
@bp.delete('/remove/<int:id>')
@authorize("traceability:production:remove", log=True)
def delete(id):

    res = ProductionModel.query.filter_by(id=id).delete()
    db.session.commit()
    if not res:
        return fail_api(msg="删除失败")
    return success_api(msg="删除成功")


#  编辑用户
@bp.get('/edit/<int:id>')
@authorize("traceability:production:edit", log=True)
def edit(id):
    production_info = curd.get_one_by_id(ProductionModel, id)


    return render_template('traceability/production/edit.html', info=production_info)


#  编辑用户
@bp.put('/update')
@authorize("traceability:production:edit", log=True)
def update():
    req_json = request.get_json(force=True)
    id = str_escape(req_json.get("id"))
    # username = str_escape(req_json.get('username'))
    # real_name = str_escape(req_json.get('realName'))
    # dept_id = str_escape(req_json.get('deptId'))
    row = {
        '生产指令单号': str_escape(req_json.get("生产指令单号")),  # 检验是否为空
        '名称': str_escape(req_json.get("名称")),  # 检验是否为空
        '规格': str_escape(req_json.get("规格")),  # 检验是否为空
        '产地': str_escape(req_json.get("产地")),  # 检验是否为空
        '批号': str_escape(req_json.get("批号")),  # 检验是否为空
        '生产日期': str_escape(req_json.get("生产日期")),  # 检验是否为空
        '代码': str_escape(req_json.get("代码")),  # 检验是否为空
        '执行标准': str_escape(req_json.get("执行标准")),  # 检验是否为空
        '商品条码': str_escape(req_json.get("商品条码")),  # 检验是否为空
        '包装规格': str_escape(req_json.get("包装规格")),  # 检验是否为空
        '养护内容': str_escape(req_json.get("养护内容")) if str_escape(req_json.get("养护内容")) else '',  # 检验是否为空
        '生产厂家': str_escape(req_json.get("生产厂家")),  # 检验是否为空
        '生产地址': str_escape(req_json.get("生产地址")),  # 检验是否为空
    }

    for k, v in row.items():
        if k == '养护内容':
            continue
        if not v:
            return fail_api(msg=f"{k}不得为空")
    try:
        query=ProductionModel.query.filter_by(id=id).update(row)
        db.session.commit()
    except:
        return fail_api(msg="更新失败,可能是格式错误")
    if not query:
        return fail_api(msg="更新失败")
    return success_api(msg="更新成功")

